package com.fbli.Thread.ThreadPool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) {
        /**
         * 使用给定的初始参数创建一个新的ThreadPoolExecutor 。
         *
         * 参数：
         * corePoolSize – 要保留在池中的线​​程数，即使它们处于空闲状态，除非设置了allowCoreThreadTimeOut
         * maximumPoolSize – 池中允许的最大线程数
         * keepAliveTime – 当线程数大于核心数时，这是多余空闲线程在终止前等待新任务的最长时间。
         * unit – keepAliveTime参数的时间单位
         * workQueue – 用于在执行任务之前保存任务的队列。 这个队列将只保存execute方法提交的Runnable任务。
         * threadFactory – 执行程序创建新线程时使用的工厂
         * handler – 执行被阻塞时使用的处理程序，因为达到了线程边界和队列容量
         * 抛出：
         * IllegalArgumentException – 如果以下情况之一成立： corePoolSize < 0 keepAliveTime < 0 maximumPoolSize <= 0 maximumPoolSize < corePoolSize
         * NullPointerException – 如果workQueue或threadFactory或handler为 null
         * 推断注释：
         * 参数unit ： @org.jetbrains.annotations.NotNull
         * 参数工作workQueue ： @org.jetbrains.annotations.NotNull
         * 参数threadFactory ：@ org.jetbrains.annotations.NotNull
         * 参数handler ： @org.jetbrains.annotations.NotNull
         */
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 1L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        for (int i = 0; i < 9; i++) {
            threadPoolExecutor.execute(()->{
                System.out.println(Thread.currentThread().getName()+"===办理业务");
            });
        }
        threadPoolExecutor.shutdownNow();
    }
}
